import request from '@/utils/http'
import { BaseResponse } from './common'

// VIP折扣信息
export interface VipDiscountInfo {
  type: 'percent' | 'amount' // 折扣类型：百分比或金额
  value: number // 折扣值（百分比或金额分）
}

// 商品规格
export interface Specification {
  name: string // 规格名称
  stock: number // 该规格库存
  priceAdjustment: number // 价格调整（分）
}

// 商品类型定义
export interface Product {
  _id?: string
  name: string
  description: string
  detail: string
  price: number
  image: string // 主图片
  images: string[] // 图片列表
  type: 'vip' | 'ticket' | 'physical'
  status: 'active' | 'inactive'
  sort: number
  stock?: number // 库存（仅实物商品）
  ticketType?: string // 票券类型（仅入场券）
  vipDiscount?: VipDiscountInfo | null // VIP折扣（仅入场券）
  specifications?: Specification[] | null // 商品规格（仅实物商品）
  createdBy?: string
  createTime?: number // 创建时间（秒级时间戳）
  updateTime?: number // 更新时间（秒级时间戳）
}

// 商品列表查询参数
export interface ProductListParams {
  page?: number
  size?: number
  sort?: string
  order?: 'asc' | 'desc'
  type?: 'vip' | 'ticket' | 'physical'
  status?: 'active' | 'inactive'
  keyword?: string
  stockStatus?: 'inStock' | 'outOfStock' | 'lowStock'
}

// 商品列表响应
export interface ProductListResponse {
  data: Product[]
  total: number
  code: number
  message: string
}

// 创建/更新商品参数（排除后端生成的字段）
export interface CreateProductParams {
  name: string
  description: string
  detail: string
  price: number
  image: string
  images: string[]
  type: 'vip' | 'ticket' | 'physical'
  status: 'active' | 'inactive'
  sort: number
  stock?: number
  ticketType?: string
  vipDiscount?: VipDiscountInfo | null
  specifications?: Specification[] | null
}

// 通用响应消息
export interface ProductActionResponse {
  message: string
}

// 后端上传响应
export interface UploadImagesResponse {
  code: number
  message: string
  total: number
  data: string[] // 文件ID数组
}

// 待上传文件信息
export interface PendingUpload {
  file: File
  fileName: string
  fieldType: 'image' | 'images' // 区分主图还是图片列表
}

export class ProductService {
  // 获取商品列表
  static getProductList(params?: ProductListParams) {
    return request.get<BaseResponse<Product[]>>({
      url: '/api/v1/admin/product/list',
      params
    })
  }

  // 获取商品详情
  static getProductDetail(id: string) {
    return request.get<BaseResponse<Product>>({
      url: `/api/v1/admin/product/detail/${id}`
    })
  }

  // 创建新商品
  static createProduct(params: CreateProductParams) {
    return request.post<BaseResponse>({
      url: '/api/v1/admin/product/create',
      params
    })
  }

  // 更新商品信息
  static updateProduct(id: string, params: Partial<CreateProductParams>) {
    return request.put<BaseResponse>({
      url: `/api/v1/admin/product/update/${id}`,
      params
    })
  }

  // 删除商品
  static deleteProduct(id: string) {
    return request.del<BaseResponse>({
      url: `/api/v1/admin/product/delete/${id}`
    })
  }

  // 上传商品图片到后端
  static async uploadProductImages(files: File[]): Promise<string[]> {
    if (files.length === 0) {
      return []
    }

    const formData = new FormData()

    // 按顺序添加文件到表单数据中
    files.forEach((file) => {
      formData.append('files', file)
    })

    try {
      const response = await request.post<BaseResponse<string[]>>({
        url: '/api/v1/admin/product/upload-images',
        data: formData
      })

      if (response.code === 200 && response.data) {
        return response.data
      } else {
        throw new Error(response.message || '上传失败')
      }
    } catch (error) {
      console.error('上传商品图片失败:', error)
      throw error
    }
  }

  // 批量上传文件并返回分组结果
  static async batchUploadFiles(
    pendingUploads: PendingUpload[]
  ): Promise<{ image?: string; images?: string[] }> {
    if (pendingUploads.length === 0) {
      return {}
    }

    try {
      // 1. 分离主图和其他图片
      const imageUploads = pendingUploads.filter((upload) => upload.fieldType === 'image')
      const imagesUploads = pendingUploads.filter((upload) => upload.fieldType === 'images')

      // 2. 合并所有文件，确保主图在第一位
      const allFiles: File[] = []
      const fileTypeMap: ('image' | 'images')[] = []

      // 主图在前
      imageUploads.forEach((upload) => {
        allFiles.push(upload.file)
        fileTypeMap.push('image')
      })

      // 其他图片在后
      imagesUploads.forEach((upload) => {
        allFiles.push(upload.file)
        fileTypeMap.push('images')
      })

      // 3. 统一上传所有文件
      const fileIds = await this.uploadProductImages(allFiles)

      // 4. 根据文件类型映射分组结果
      const result: { image?: string; images?: string[] } = {}

      fileIds.forEach((fileId, index) => {
        const fieldType = fileTypeMap[index]
        if (fieldType === 'image') {
          result.image = fileId
        } else if (fieldType === 'images') {
          if (!result.images) {
            result.images = []
          }
          result.images.push(fileId)
        }
      })

      return result
    } catch (error) {
      console.error('批量上传文件失败:', error)
      throw error
    }
  }
}
